package santeclair.referentiel.webservice.rest.impl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import santeclair.referentiel.bean.Ville;
import santeclair.referentiel.dto.ImpressionVilleDto;
import santeclair.referentiel.dto.VilleDto;
import santeclair.referentiel.optique.referentiel.service.ZoneOptiqueService;
import santeclair.referentiel.service.VilleService;
import santeclair.referentiel.webservice.VilleWebService;

import com.google.common.annotations.VisibleForTesting;

@Service("villeWebService")
public class VilleWebServiceImpl implements VilleWebService {

    @Autowired
    @Qualifier("villeService")
    private VilleService villeService;

    @Autowired
    private ZoneOptiqueService zoneOptiqueService;

    /**
     * {@inheritDoc}
     */
    @Override
    public List<VilleDto> listerVillesRellesParDepartement(String codeDepartement) {
        List<VilleDto> result = new ArrayList<VilleDto>();
        for (Ville ville : villeService.findVillesReellesByCodeDepartement(codeDepartement)) {
            VilleDto villeDto = creerVilleDto(ville);
            result.add(villeDto);
        }
        return result;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public List<VilleDto> listerVillesParDepartement(String codeDepartement) {
        List<VilleDto> result = new ArrayList<VilleDto>();
        for (Ville ville : villeService.findVillesByCodeDepartement(codeDepartement)) {
            VilleDto villeDto = creerVilleDto(ville);
            result.add(villeDto);
        }
        return result;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public List<VilleDto> listerVillesParCodePostal(String codePostal) {
        List<VilleDto> result = new ArrayList<VilleDto>();
        List<Ville> listeVilles = villeService.findVillesByCodePostal(codePostal);
        if (listeVilles != null) {
            for (Ville ville : listeVilles) {
                VilleDto villeDto = creerVilleDto(ville);
                result.add(villeDto);
            }
        }
        return result;
    }

    @Override
    public List<VilleDto> listerVillesAvecZoneOptiqueParCodePostal(String codePostal) {
        List<VilleDto> result = new ArrayList<VilleDto>();
        List<Ville> listeVilles = zoneOptiqueService.findVillesWithZoneOptiqueByCodePostal(codePostal);
        if (listeVilles != null) {
            for (Ville ville : listeVilles) {
                VilleDto villeDto = creerVilleDto(ville);
                result.add(villeDto);
            }
        }
        return result;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public VilleDto getVilleParCode(String codeVille) {
        Ville ville = villeService.findVilleByCode(codeVille);
        VilleDto villeDto = creerVilleDto(ville);

        return villeDto;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public ImpressionVilleDto getVilleParCodePourImpression(String codeVille) {
        Ville ville = villeService.findVilleByCode(codeVille);
        ImpressionVilleDto impressionVilleDto = creerImpressionVilleDto(ville);
        return impressionVilleDto;
    }

    /**
     * Convertit l'objet Ville en objet VilleDto.
     */
    private VilleDto creerVilleDto(Ville ville) {
        if (ville == null) {
            return null;
        }
        VilleDto villeDto = new VilleDto();
        villeDto.setId(ville.getId());
        villeDto.setCode(ville.getCode());
        villeDto.setCodeInsee(ville.getCodeInsee());
        villeDto.setCodePostal(ville.getCodePostal());
        villeDto.setIsCedex(ville.getIsCedex());
        villeDto.setIsVisible(ville.getIsVisible());
        villeDto.setLatitude(ville.getLatitude());
        villeDto.setLongitude(ville.getLongitude());
        villeDto.setNom(ville.getNom());
        return villeDto;
    }

    /**
     * Convertit l'objet Ville en objet VilleDto.
     */
    private ImpressionVilleDto creerImpressionVilleDto(Ville ville) {
        if (ville == null) {
            return null;
        }
        ImpressionVilleDto villeDto = new ImpressionVilleDto();
        villeDto.setCodeInsee(ville.getCodeInsee());
        villeDto.setCodePostal(ville.getCodePostal());
        villeDto.setLatitude(ville.getLatitude().toString());
        villeDto.setLongitude(ville.getLongitude().toString());
        villeDto.setNom(ville.getNom());
        return villeDto;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public VilleDto getVilleParCodePostalEtNom(String codePostal, String nomVille) {
        Ville ville = villeService.findVilleByCodePostalAndNomVille(codePostal, nomVille);
        VilleDto villeDto = creerVilleDto(ville);
        return villeDto;
    }

    /* ======================================================= *
     *                      getters & setters 
     * ======================================================= */

    /**
     * @param villeService the villeService to set
     */
    @VisibleForTesting
    public void setVilleService(VilleService villeService) {
        this.villeService = villeService;
    }

}
